package com.example.ranking.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.ranking.domain.dto.PetPopularRespDTO;
import com.example.ranking.domain.po.PetPopularRankingPO;
import com.example.api.client.PetInfoFeignClient;
import com.example.ranking.mapper.RankingMapper;
import com.example.ranking.service.RankingService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 排行榜业务实现类
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class RankingServiceImpl implements RankingService {

    private final PetInfoFeignClient petInfoFeignClient;
    private final RankingMapper RankingMapper;

    @Override
    public IPage<PetPopularRespDTO> getPetPopularRanking(Integer pageNum, Integer pageSize) {
        // 1. 校验分页参数
        pageNum = pageNum == null ? 1 : pageNum;
        pageSize = pageSize == null ? 10 : pageSize;

        // 2. 分页查询统计数据（按数量降序）
        Page<PetPopularRankingPO> page = new Page<>(pageNum, pageSize);
        IPage<PetPopularRankingPO> rankingPage = RankingMapper.selectPopularRankingPage(page);

        // 3. 转换为DTO（补充排名：当前页码起始排名 + 索引）
        long startRank = (pageNum - 1) * pageSize + 1;
        return rankingPage.convert(po -> {
            PetPopularRespDTO dto = new PetPopularRespDTO();
            dto.setPetBreed(po.getPetBreed());
            dto.setCurrentCount(po.getCurrentCount());
            // 计算排名（如第1页第1条是1，第2页第1条是11）
            dto.setRank((int) (startRank + rankingPage.getRecords().indexOf(po)));
            return dto;
        });
    }

    @Override
    @Transactional(rollbackFor = Exception.class) //（TODO：淘汰了）
    public Boolean refreshPopularRanking() {
//        // 1. 远程调用pet-info-service，获取当前"运输中（3）+代养中（4）"的品种统计
//        Map<String, Integer> breedCountMap = petInfoFeignClient.countBreedByLendStatus(3, 4);
//        Assert.isTrue(!CollectionUtils.isEmpty(breedCountMap), "获取宠物状态统计数据失败");
//
//        // 2. 遍历统计结果，更新本地人气榜表格（存在则更新数量，不存在则新增）
//        for (Map.Entry<String, Integer> entry : breedCountMap.entrySet()) {
//            String petBreed = entry.getKey();
//            Integer currentCount = entry.getValue();
//
//            // 2.1 查询该品种是否已有统计记录
//            PetPopularRankingPO existPO = popularRankingMapper.selectByBreed(petBreed);
//            if (existPO != null) {
//                // 2.2 存在：更新数量
//                existPO.setCurrentCount(currentCount);
//                popularRankingMapper.updateById(existPO);
//            } else {
//                // 2.3 不存在：新增记录
//                PetPopularRankingPO newPO = new PetPopularRankingPO();
//                newPO.setPetBreed(petBreed);
//                newPO.setCurrentCount(currentCount);
//                popularRankingMapper.insert(newPO);
//            }
//        }

        return true;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean initPopularRanking() {
        try {
            // 1. 清空原有统计数据（避免重复初始化）
            RankingMapper.delete(new LambdaQueryWrapper<>());
            log.info("清空原有统计数据完成");

            // 2. 全量查询pet_info表中状态3/4的记录，按品种分组统计
            List<PetPopularRespDTO> breedCountList = RankingMapper.selectBreedCountByTargetStatus(
                    List.of(3, 4)); // Mapper中新增该方法，按品种分组count

            // 3. 批量插入统计结果
            if (!CollectionUtils.isEmpty(breedCountList)) {
                List<PetPopularRankingPO> poList = breedCountList.stream()
                        .map(map -> {
                            PetPopularRankingPO po = new PetPopularRankingPO();
                            po.setPetBreed(map.getPetBreed());
                            po.setCurrentCount(map.getCurrentCount());
                            return po;
                        })
                        .collect(Collectors.toList());
                // 批量插入（MyBatis-Plus批量插入）
                RankingMapper.batchInsert(poList);
                log.info("全量初始化完成，新增统计记录数：{}", poList.size());
            } else {
                log.info("全量初始化完成，无状态3/4的宠物记录");
            }
            return true;
        } catch (Exception e) {
            log.error("全量初始化人气榜失败", e);
            return false;
        }
    }
}
